/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Alertas;

import Entidades.Empresa;
import Entidades.Envioalerta;
import Entidades.Equipo;
import Entidades.Medicion;
import Entidades.Sensor;
import Entidades.Subscripcionalerta;
import Entidades.Valoresconfigurados;
import Persistencia.FachadaPersistencia;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.MessagingException;

/**
 *
 * @author Luis
 */
public class AlertaFueraDeLoNormal implements Alerta {

    ArrayList<Sensor> sensores;
    ArrayList<Medicion> mediciones;

    @Override
    public void enviarAlerta(ArrayList _sensores, ArrayList _mediciones) {
        sensores = _sensores;
        mediciones = _mediciones;
        String asunto = "Valores fuera de lo normal";
        String mensaje = generarMensaje();
        for (int i = 0; i < sensores.size(); i++) {
            ArrayList<Subscripcionalerta> sub = FachadaPersistencia.getInstancia().buscarSubscripcionesDeAlerta(sensores.get(i).getIdSensor());
            if (!sub.isEmpty()) {
                for (int j = 0; j < sub.size(); j++) {
                    if (validarEnvio(sub.get(j))) {
                        Mailer m = new Mailer();
                        Envioalerta envio = new Envioalerta();
                        try {
                            m.enviarMail(asunto, mensaje, sub.get(j).getSdUsers().getEmail());
                            envio.setEstado("Enviado");
                            System.out.println("Envio mail");
                        } catch (MessagingException ex) {
                            envio.setEstado("No enviado");
                            Logger.getLogger(AlertaFueraDeLoNormal.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        envio.setSdSensorSubscripcionalerta(sub.get(j));
                        envio.setCuerpo(sub.get(j).getSdUsers().getEmail() + ":\n" + mensaje);
                        FachadaPersistencia.getInstancia().guardar(envio);
                    }
                }
            }
        }
    }

    public String generarMensaje() {
        Empresa empresa = sensores.get(0).getSdSensorEquipo().getSdSensorEmpresa();
        Equipo equipo = sensores.get(0).getSdSensorEquipo();
        String encabezado = "Fecha: " + new Date().toLocaleString() + "hs\n"
                + "Equipo: " + equipo.getNombre() + "\n"
                + "Código: " + equipo.getCodigoEquipo() + "\n"
                + "Empresa: " + empresa.getNombre() + "\n"
                + "Ubicación: " + equipo.getUbicacion() + "\n\n";
        String s = "";
        for (int i = 0; i < sensores.size(); i++) {
            Valoresconfigurados valores = sensores.get(i).getValoresConfigurados();
            String abreviatura = sensores.get(i).getSdSensorTiposensor().getSdSensorUnidaddemedida().getAbreviatura();
            s += "Sensor: " + sensores.get(i).getNombre() + " detecta valores fuera de los límites establecidos\nValor actual: "
                    + round(getMedicionPorSensor(sensores.get(i).getIdSensor()).getValor(), 2) + abreviatura + "\n"
                    + "Valor máximo permitido: " + round(valores.getValorMaximo(), 2) + abreviatura
                    + "\nValor mínimo permitido: " + round(valores.getValorMinimo(), 2) + abreviatura
                    + "\nTiempo fuera de los límites permitido: " + sensores.get(i).getTiempoFueraDeLosLimites() + "hs\n"
                    + "Tiempo entre alertas configurado: " + sensores.get(i).getTiempoEntreAlerta() + "hs\n\n";
        }
        return encabezado + s;
    }

    public Medicion getMedicionPorSensor(int id) {

        for (int i = 0; i < mediciones.size(); i++) {
            if (mediciones.get(i).getIdSensor() == id) {
                return mediciones.get(i);
            }
        }
        return null;
    }

    public boolean validarEnvio(Subscripcionalerta sub) {
        Envioalerta alerta = sub.obtenerUltimaAlertaEnviadaParaEnvio();
        if (alerta == null) {
            return true;
        } else {
            return false;
        }
    }

    public static Float round(Float d, int decimalPlace) {
        BigDecimal bd = new BigDecimal(Float.toString(d));
        bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
        return bd.floatValue();
    }
}
